RubyKaigi 2022 Day 1 Towards Ruby 4 JIT
HAMLをv6でメッチャ速くした
code:ruby
def three = 1 + 2
puts RubyVM::InstructionSequence.of(method(:three)).disasm
MJITよりもYJITのほうが特定の場合で特に速い
MJIT
Ruby 2.6以降
Ruby 3.1
stable-ish, portable, native threads, written in C
Ruby 3.2
Experimental, fort + SIGCHLD, written in Ruby
standard library
YJIT
Ruby 3.1以降
--jit or --yjit
Ruby 3.1
x86_64 only, no code GC, written in C
Ruby 3.2
arm64 support, (hopefully) code GC, written in Rust BYOJ (Bring Your Own JIT) --mjit=pause
define RubyVM::MJIT.compile
c = RubyVM::MJIT.const_get(:c)
RubyVM::MJIT.resume to start JIT
RubyのJIT書いてないのはお前だけ
Benchmarking your JIT
Future of YJIT
Ruby 4 fast as Java or Javascript
If fast, it's should be a reason to leave Python
Ruby 4 Canary
Array.min, max, include?などが爆速に
(1..100_000).eachも爆速に
Challenges
Constants
Rubyのコードを実行時に解析して最適化したRubyコードにしてやる
定数の冗長な参照を減らしてしまうことでメモリアクセスが減って高速になる
Variables
これもRubyのコードを実行時に解析して最適化したRubyコードにしてやる
グローバル変数にしてしまってメモリを予め確保しておいてるっぽい?yuiseki.icon
class var
instance var
Method calls
Code locality
Method inlining: C ↔ Ruby
etc
Garbage collection
メソッドの開始と終了でSTACK.addressでメモリを明示的に確保して明示的に解放する